"""
   ┌─┐       ┌─┐ + +
┌──┘ ┴───────┘ ┴──┐++
│                 │
│       ───       │++ + + +
███████───███████ │+
│                 │+
│       ─┴─       │
│                 │
└───┐         ┌───┘
    │         │
    │         │   + +
    │         │
    │         └──────────────┐
    │                        │
    │                        ├─┐
    │                        ┌─┘
    │                        │
    └─┐  ┐  ┌───────┬──┐  ┌──┘  + + + +
      │ ─┤ ─┤       │ ─┤ ─┤
      └──┴──┘       └──┴──┘  + + + +
             神兽保佑
            代码无BUG!
"""
import pymysql


class SQLManager(object):

    def __init__(self):  # 实例化后自动执行此函数
        self.connect()

    def connect(self):  # 此时进入数据库，游标也已经就绪
        self.conn = pymysql.connect(
            host="127.0.0.1",user= "root", password="12345678", database="hc", charset='utf8mb4'
        )
        self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)  # 返回的是字典
        self.cur = self.conn.cursor()  # 返回的是元组

    def get_dict_more(self, sql, args=None):
        """
        查询
        :param sql: 查询的数据语句
        :param args: 查询语句所带参数
        :return: 返回查询出所有的数据    {id:"",title:"",id:"",title:""}  如果没有结果,返回的是()
        """
        self.cursor.execute(sql, args)
        result = self.cursor.fetchall()
        return result

    def get_dict_one(self, sql, args=None):
        """
        查询
        :param sql: 查询的数据语句
        :param args: 查询语句所带参数
        :return: 返回查询出所有的数据    {id:"",title:""}  如果没有结果,返回的是null
        """
        self.cursor.execute(sql, args)
        result = self.cursor.fetchone()
        return result

    def get_tuple_more(self, sql, args=None):
        """
        查询
        :param sql: 查询的数据语句
        :param args: 查询语句所带参数
        :return: 返回查询出所有的数据    （（1，2），（3，4）） 如果没有结果,返回的是()
        """
        self.cur.execute(sql, args)
        result = self.cur.fetchall()
        return result

    def get_tuple_one(self, sql, args=None):
        """
        查询
        :param sql: 查询的数据语句
        :param args: 查询语句所带参数
        :return: 返回查询出所有的数据    （1,2,3）  如果没有结果,返回的是null
        """
        self.cur.execute(sql, args)
        result = self.cur.fetchone()
        return result

    def run(self, sql, args=None):
        """
        增删改   直接执行无返回值
        :param sql: 执行语句
        :param args: 执行参数
        :return: 无返回
        """
        self.cursor.execute(sql, args)
        self.conn.commit()

    def create(self, sql, args=None):
        """
        单条插入更新删除操作数据库
        :param sql:插入更新删除的数据语句
        :param args:插入更新删除语句所带参数
        :return:返回操作对应id
        """
        self.cursor.execute(sql, args)
        self.conn.commit()
        ret = self.cursor.lastrowid  # 取到刚才创建的记录的ID
        return ret

    def m_create_id(self, sql, args=None):
        """
        多条数据库操作
        :param sql:插入更新删除的数据语句
        :param args:插入更新删除语句所带参数 [(1, 36), (1, 38), (1, 36)]
        :return:返回操作对应id
        sql = “insert into 标题名 (id,title,url) values(%s,%s,%s)"
        data=[(1, 2), (1, 3), (1, 4)])
        self.cursor.executemany(sql, data)
        """
        # self.cursor.executemany(sql, [(1, 36), (1, 38), (1, 36)])
        self.cursor.executemany(sql, args)  # 批量执行
        self.conn.commit()
        ret = self.cursor.lastrowid  # 取到刚才创建的记录的ID
        return ret

    def m_create_rowcount(self, sql, args=None):
        """
        多条数据库操作
        :param sql:插入更新删除的数据语句
        :param args:插入更新删除语句所带参数 [(1, 36), (1, 38), (1, 36)]
        :return:返回操作对应id
        sql = “insert into 标题名 (id,title,url) values(%s,%s,%s)"
        data=[(1, 2), (1, 3), (1, 4)])
        self.cursor.executemany(sql, data)
        """
        # self.cursor.executemany(sql, [(1, 36), (1, 38), (1, 36)])
        self.cursor.executemany(sql, args)  # 批量执行
        self.conn.commit()
        ret = self.cursor.rowcount  # 返回一共受影响行数
        return ret

    def close(self):
        self.cursor.close()
        self.conn.close()
